package dataType;

import java.awt.Color;
import java.util.ArrayList;

import utils.UtilGenera3D;
import utils.UtilPoligono;
import figuras.PuntoVector;

public class DataCirculo {
	
	//Atributos
	private ArrayList<PuntoVector> elementos2D;
	private ArrayList<Coordenadas3D> elementos3D;
	private int tamanno;
	private double radio;
	private ArrayList<PuntoVector> perfil;

	protected void setPerfil(ArrayList<PuntoVector> perfil) {
		this.perfil = perfil;
	}

	//Constructores
	protected DataCirculo(){
		this.elementos2D = new ArrayList<PuntoVector>();
		this.elementos3D = new ArrayList<Coordenadas3D>();
	}
	
	protected DataCirculo(int tam, double r, Color c){
		this.elementos2D = new ArrayList<PuntoVector>();
		this.elementos3D = new ArrayList<Coordenadas3D>();
		this.radio = r;
		this.tamanno = tam;
	}
	
	protected DataCirculo(ArrayList<PuntoVector> p2d, double r, int s, Color c, 
			ArrayList<String> files,ArrayList<PuntoVector> perfil){
		
		this.elementos2D = p2d;
		this.radio = r;
		this.tamanno = s;
		this.perfil = perfil;
		
		distribuyePuntos3D(files);	
	}
	
	protected DataCirculo(ArrayList<PuntoVector> p2d, ArrayList<Coordenadas3D> p3d,
			double r, int s, Color c){
		
		this.elementos2D = p2d;
		this.radio = r;
		this.tamanno = s;
		this.elementos3D = p3d;	
	}
	
	//Metodos	
	protected void distribuyeElementos(int n){
		
		PuntoVector[] poligono = UtilPoligono.poligonoRegularXY(
				new PuntoVector(0,0,0,1), radio, n, false, null, null);
		this.elementos2D = new ArrayList<PuntoVector>();
		for(int i=0;i<poligono.length;i++)
			elementos2D.add(poligono[i]);
		
		distribuyePuntos3D();
	}
	
	protected void distribuyeElementosPistilo(int n) {
		
		this.elementos2D = new ArrayList<PuntoVector>();
		if(n==1)
			elementos2D.add(new PuntoVector(0,0,0,1));
		else if(n>1){
			PuntoVector[] poligono = UtilPoligono.poligonoRegularXY(
					new PuntoVector(0,0,0,1), radio, n-1, false, null, null);
			for(int i=0;i<poligono.length;i++)
				elementos2D.add(poligono[i]);
			elementos2D.add(new PuntoVector(0,0,0,1));
		}
		
		distribuyePuntos3D();
	}

	protected double getRadio() {
		return radio;
	}

	protected void setRadio(double radio, int nCir) {
		this.radio = radio;
		if (nCir == 3)
			distribuyeElementosPistilo(elementos2D.size());
		else	
			distribuyeElementos(elementos2D.size());
	}
	
	private void distribuyePuntos3D() {
		
		if( perfil != null ){
			//Guardamos los files
			ArrayList<String> filesAux = new ArrayList<String>(); 
			for(int i=0; i<elementos3D.size();i++){
				Coordenadas3D d3 = elementos3D.get(i);
				String aux = d3.getFile();
				if (aux == null)
					aux = "";
				filesAux.add(aux);
			}		
			
			elementos3D = new ArrayList<Coordenadas3D>();
      	    for(int i=0; i<elementos2D.size(); i++){
      	    	Coordenadas3D coordenada3d;
      	    	try{
      	    		coordenada3d = distribuye3D(elementos2D.get(i));
      	    	}
      	    	catch(Exception e){
      	    		coordenada3d = null;
      	    	}
      	    	elementos3D.add(coordenada3d);
      	    }
      	    
      	    //recuperamos los files
      	    int i=0;
      	    while(i<elementos3D.size() && i<filesAux.size()){
      	    	Coordenadas3D d3 = elementos3D.get(i);
      	    	String aux = filesAux.get(i);
      	    	if(!aux.equals(""))
      	    		d3.setFile(aux);
      	    	i++;
      	    }
      	    
		 }	
	}
	
	private void distribuyePuntos3D(ArrayList<String> files) {
		
		if( perfil != null ){
			elementos3D = new ArrayList<Coordenadas3D>();
			
      	    for(int i=0; i<elementos2D.size(); i++){
      	    	Coordenadas3D coordenada3d;
      	    	try{
      	    		coordenada3d = distribuye3D(elementos2D.get(i));
      	    		coordenada3d.setFile(files.get(i));
      	    	}
      	    	catch(Exception e){
      	    		coordenada3d = null;
      	    	}
      	    	elementos3D.add(coordenada3d);
      	    }
		 }	
	}
	
	protected  Coordenadas3D distribuye3D(PuntoVector punto) throws Exception{
		
		try{
			return UtilGenera3D.algoritmo(punto, perfil);
		}
		catch(Exception e){
			e.toString();
			throw new Exception(e);
		}
	}

	protected ArrayList<PuntoVector> getElementos2D() {
		return (ArrayList<PuntoVector>) elementos2D;
	}

	protected void setElementos2D(ArrayList<PuntoVector> elementos2D) {
		this.elementos2D = elementos2D;
	}

	protected int getTamanno() {
		return tamanno;
	}

	protected void setTamanno(int tamanno) {
		this.tamanno = tamanno;
	}

	public ArrayList<Coordenadas3D> getElementos3D() {
		return elementos3D;
	}

	public void setElementos3D(ArrayList<Coordenadas3D> elementos3D) {
		this.elementos3D = elementos3D;
	}
	
	protected void rellenaFilenames(String file){
		
		for(int i=0; i<elementos3D.size(); i++)
			elementos3D.get(i).setFile(file);
	}
	
	protected String getFile1Element(int elem){
		
		return elementos3D.get(elem).getFile();
	}

	protected void borra(double r) {
		
		//borramos elemetos 2d
		for(int i=0; i<elementos2D.size();i++)
			elementos2D.remove(i);
		elementos2D = new ArrayList<PuntoVector>();
		
		//borramos elementos3d
		for(int i=0; i<elementos3D.size();i++)
			elementos3D.remove(i);
		elementos3D = new ArrayList<Coordenadas3D>();
		
		//reestablecemos los valores predeterminados
		//del radio y tamano.
		this.radio = r;
		tamanno = 5;
		
	}
	
	protected void borraFiles(){
		for(int i=0; i< elementos3D.size();i++){
			Coordenadas3D c = elementos3D.get(i);
			c.setFile(null);
		}
	}
}
